{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. Linear Models for Classification"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "from prml.preprocess import PolynomialFeature\n",
    "from prml.linear import (\n",
    "    BayesianLogisticRegression,\n",
    "    LeastSquaresClassifier,\n",
    "    FishersLinearDiscriminant,\n",
    "    LogisticRegression,\n",
    "    Perceptron,\n",
    "    SoftmaxRegression\n",
    ")\n",
    "\n",
    "np.random.seed(1234)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def create_toy_data(add_outliers=False, add_class=False):\n",
    "    x0 = np.random.normal(size=50).reshape(-1, 2) - 1\n",
    "    x1 = np.random.normal(size=50).reshape(-1, 2) + 1.\n",
    "    if add_outliers:\n",
    "        x_1 = np.random.normal(size=10).reshape(-1, 2) + np.array([5., 10.])\n",
    "        return np.concatenate([x0, x1, x_1]), np.concatenate([np.zeros(25), np.ones(30)]).astype(np.int)\n",
    "    if add_class:\n",
    "        x2 = np.random.normal(size=50).reshape(-1, 2) + 3.\n",
    "        return np.concatenate([x0, x1, x2]), np.concatenate([np.zeros(25), np.ones(25), 2 + np.zeros(25)]).astype(np.int)\n",
    "    return np.concatenate([x0, x1]), np.concatenate([np.zeros(25), np.ones(25)]).astype(np.int)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.1 Discriminant Functions"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.1.3 Least squares for classification"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_train, y_train = create_toy_data()\n",
    "x1_test, x2_test = np.meshgrid(np.linspace(-5, 5, 100), np.linspace(-5, 5, 100))\n",
    "x_test = np.array([x1_test, x2_test]).reshape(2, -1).T\n",
    "\n",
    "feature = PolynomialFeature(1)\n",
    "X_train = feature.transform(x_train)\n",
    "X_test = feature.transform(x_test)\n",
    "\n",
    "model = LeastSquaresClassifier()\n",
    "model.fit(X_train, y_train)\n",
    "y = model.classify(X_test)\n",
    "\n",
    "plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train)\n",
    "plt.contourf(x1_test, x2_test, y.reshape(100, 100), alpha=0.2, levels=np.linspace(0, 1, 3))\n",
    "plt.xlim(-5, 5)\n",
    "plt.ylim(-5, 5)\n",
    "plt.gca().set_aspect('equal', adjustable='box')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_train, y_train = create_toy_data(add_outliers=True)\n",
    "x1_test, x2_test = np.meshgrid(np.linspace(-5, 15, 100), np.linspace(-5, 15, 100))\n",
    "x_test = np.array([x1_test, x2_test]).reshape(2, -1).T\n",
    "\n",
    "feature = PolynomialFeature(1)\n",
    "X_train = feature.transform(x_train)\n",
    "X_test = feature.transform(x_test)\n",
    "\n",
    "least_squares = LeastSquaresClassifier()\n",
    "least_squares.fit(X_train, y_train)\n",
    "y_ls = least_squares.classify(X_test)\n",
    "\n",
    "logistic_regression = LogisticRegression()\n",
    "logistic_regression.fit(X_train, y_train)\n",
    "y_lr = logistic_regression.classify(X_test)\n",
    "\n",
    "plt.subplot(1, 2, 1)\n",
    "plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train)\n",
    "plt.contourf(x1_test, x2_test, y_ls.reshape(100, 100), alpha=0.2, levels=np.linspace(0, 1, 3))\n",
    "plt.xlim(-5, 15)\n",
    "plt.ylim(-5, 15)\n",
    "plt.gca().set_aspect('equal', adjustable='box')\n",
    "plt.title(\"Least Squares\")\n",
    "plt.subplot(1, 2, 2)\n",
    "plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train)\n",
    "plt.contourf(x1_test, x2_test, y_lr.reshape(100, 100), alpha=0.2, levels=np.linspace(0, 1, 3))\n",
    "plt.xlim(-5, 15)\n",
    "plt.ylim(-5, 15)\n",
    "plt.gca().set_aspect('equal', adjustable='box')\n",
    "plt.title(\"Logistic Regression\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_train, y_train = create_toy_data(add_class=True)\n",
    "x1_test, x2_test = np.meshgrid(np.linspace(-5, 10, 100), np.linspace(-5, 10, 100))\n",
    "x_test = np.array([x1_test, x2_test]).reshape(2, -1).T\n",
    "\n",
    "feature = PolynomialFeature(1)\n",
    "X_train = feature.transform(x_train)\n",
    "X_test = feature.transform(x_test)\n",
    "\n",
    "least_squares = LeastSquaresClassifier()\n",
    "least_squares.fit(X_train, y_train)\n",
    "y_ls = least_squares.classify(X_test)\n",
    "\n",
    "logistic_regression = SoftmaxRegression()\n",
    "logistic_regression.fit(X_train, y_train, max_iter=1000, learning_rate=0.01)\n",
    "y_lr = logistic_regression.classify(X_test)\n",
    "\n",
    "plt.subplot(1, 2, 1)\n",
    "plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train)\n",
    "plt.contourf(x1_test, x2_test, y_ls.reshape(100, 100), alpha=0.2, levels=np.array([0., 0.5, 1.5, 2.]))\n",
    "plt.xlim(-5, 10)\n",
    "plt.ylim(-5, 10)\n",
    "plt.gca().set_aspect('equal', adjustable='box')\n",
    "plt.title(\"Least squares\")\n",
    "plt.subplot(1, 2, 2)\n",
    "plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train)\n",
    "plt.contourf(x1_test, x2_test, y_lr.reshape(100, 100), alpha=0.2, levels=np.array([0., 0.5, 1.5, 2.]))\n",
    "plt.xlim(-5, 10)\n",
    "plt.ylim(-5, 10)\n",
    "plt.gca().set_aspect('equal', adjustable='box')\n",
    "plt.title(\"Softmax Regression\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.1.4 Fisher's linear discriminant"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQEAAAD8CAYAAAB3lxGOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzt3Xl4VOXZ+PHvPXs2krCvCgKKgAKKQEUFBeoCWrVutaKtVWqtrb7aunTxte/b9qq/Vlu7uFC19a2totZ9Q1AQFKmCoKAoKgYJskPIOvvz++OEJJOZhCxnZjI59+e6uC4yc+aceyBzz3Oe5X7EGINSyrlc2Q5AKZVdmgSUcjhNAko5nCYBpRxOk4BSDqdJQCmH0ySglMNpElDK4TQJKOVwnmxctGfvnmbQIYOzcWmlHGH9mnW7jTF92nJsVpLAoEMG8+zyZ7NxaaUc4bDCYZvbeqzeDijlcJoElHI4TQJKOZwmAaUcTpOAUg6nSUAph9MkoJTDaRJQyuE0CSjlcJoElHI4TQJKOZwmAaUcTpOAUg6nSUAph9MkoJTDaRJQyuFsSwIi4haRNSLyvF3nVEqln50tgWuBDTaeTymVAbYkAREZDMwG7rfjfEqpzLGrJfAH4EYgbtP5lFIZ0ukkICJzgJ3GmNUHOW6eiKwSkVV7d+/p7GWVUjaxoyUwFThLRMqAR4FTROTh5gcZY+YbYyYaYyb27N3LhssqpezQ6SRgjLnFGDPYGDMUuAh4zRhzSacjU0plhM4TUMrhbN18xBizFFhq5zmVUumlLQGlHE6TgFIOp0lAKYfTJKCUw2kSUMrhNAko5XCaBJRyOE0CSjmcJgGlHE6TgFIOp0lAKYfTJKCUw2kSUMrhNAko5XCaBJRyOE0CSjmcJgGlHE6TgFIOp0lAKYfTJKCUw2kSUMrhNAko5XCaBJzIxLIdgepCbN13QHVtJrgIah8BUwFSCvnfRAKnZDsslWWaBBzCBBdDzYNAqP6BfVAzH4MLCUzPZmgqy/R2wClqH6EhATQIQ+2/shGN6kI0CTiBMdY3f8rndJt4p9Mk4AQiIL1TP+fql9lYVJejScApCuYCvmYP+iB/bjaiUV2Idgw6hPhPxOCG2ochvhtcfZH8S8A/5eAvju2D+HZw9Qd3afqDVRmlScBBxH88+I9v+wtMFFN9N4TfxPpViYDveKTwGhD91ekusnI7EA5Hs3FZ1U6m9jEIrwAiQB0QhfBKTO0jWY5M2SlrfQJl5dor3eUFXwLCzR4MQ3Bh4kPGQGwLxLZaf1c5JSttOq94gcREMHRwr2yEolpV2/LjxlijDpGNmKrfgamynnKVIEU3gmdYxqJUnZO1lsAAz6CGP6Atgy7JM7KFx0dYCSBeham8DcxurIlIIYjvwOy/FeLBDAaqOqPTSUBEhojIEhHZICIfiMi17T1H00Rw4I/KPim4AvDT+GviAvxI/pXWj6E3gHiKV8Yg8p9MhKhsYMftQBS4wRjzrogUAatFZJEx5sP2nORAIgDYFt1KWfkevUXINs8IpOQOTN3TEN0EnmFI3tngtv6vTHwvyX0GABGIV2Q0VNVxnU4CxphtwLb6v1eJyAZgENCuJNDUAM8gTQRdhXsgUnh1yqfEOxoTfAFo3vT3gOfItIem7GFrx6CIDAUmAJ1uCzZNBKlocugCvOPBM9RqJTS0CPzgHdtyf4LqcmxLAiJSCPwbuM4YU5ni+XnAPICBAwc1fzqlprcITWkroYsQQXr8AhN8GUJLAAH/LCQwy+o4VDlBjA3juiLiBZ4HFhpj7jzY8WOPGmeeeHrhwQ5r1bbo1oSfNSEo1eiwwmGrjTET23KsHaMDAjwAbGhLArCLDjEqZQ875glMBeYCp4jI2vo/Z9hw3jbTIUalOs6O0YE3gKzfAOoQYxbEayC+A1x9wFWU7WhUB3XLpWCpRhY0IdjIGEzt3+rXENSvLvSfhBRcpasLc1C3LSqifQbpY+qegeAiElYXht7A1P4zy5Gpjui2SaAp7TOwWfBZUhYtDS7UVYQ5yDFtt+ZzDsrKt+otQkeZ6haeCGLNIvdmMBjVWY5oCaQywDNIWwQd1dJsQNdgEE0AucYxLYFUrESgk47aSwoux+z/GdZU4QPNfx/4pmH232bVFvBNQQKzwZUPse0Q3QhSYk0plnZ+9xhjbZ4SehFMEHyTkbyv64iETRydBMABQ4vGWB8c8drXc+8ZjpT8P0ztv611A+4h1gcy+AQNfQV15Zjga+AdVV+izG09LoVI8S/B3Tf1uWPlEK+1ipLUtypMzd31y5brzx18ERNeiRT/Hlx59rwnB3N8EmiqtUVLOZkYQqswNX8FsxdwQ2Amkn+ZPU129xCk6Drr7/FKzL4rsUYLDohYxUbCb2L1E9Q/Z0KYqtuRkjsSzxfbjan6FcS+xJp2IlAwD/GOhtCyZueOQnw/JrQUyTu98+/F4RzbJ9CSpkOLOT3EGNmIqf4dmF1ADKv3fjGm+l77rxX9hNTfJzGsBNCUsb7tY7uaPGQwlf8Nsc1YH/YwEIKav2CCy2hoRSQIQeR9W8J3Ok0CbZCLQ4ym9nFSFgkNL4d4lb0XcxXT2DfQFm4SahDEPrdmHiaJQ/j1Fs7hAbfunmQHTQJtlHMtg/jWFp7wQnyvvddyDwdXT5Jnj7tI2UKQgDWSUM/EdpC6TBkQ3wWuUpJ/Vd1I4LQOh6waaRLogJxoGXhGknpJRwxcLXTKdZQI0uO/wX0I1lZneUAA8r9bfy1//YFuwI8UXptYb8B9SCsndyM9/gc8h2MlFD9IT6ToZnD3t/d9OJR2DHZQV598JPnnY8LvkFj6yw+BOfb2qMf2YYLPQ/QDcB8GeRcjrhKr4pB4ITANQssxkffA1ccqONLswyvugRgKgJrk8/smgbsXUvxrazs0QtYmqlq0xDaaBGzS5eYcuAcjxb/C1DxkjdG7ekDgXOtDaJfYLkzFDTTOFPzEGg0ourFxBEJ8EJiBBGa0fB4RpMctVvnyho5EF1CANN0wVfdBTAtNAjbKxJyDUG2It559h/VvfERx72KmXfgVDjlycOqDPcOQ4ttsvX5TpvZfWN/eBzoFDRDGVN+DlM5v37e1dzRS8kdM8EWIbgXPaBAXpvLW+glCxyF5F2oiSANNAmmSjorJwZogv5n7Jyp27icSjIBLWL34Pb5xy7lMnn2MLdc4KGMgtNSqMhwrI+WogKmE+D5w92zfud39kYLLrVNU/wmCK2iYIBR6FRN+Gyn5E7gKOvMOVDPaMZhGdncgLn3sLfbtqLASAEDcEAlGWPD/niYairT+YpuYmnsxNfMhtokWe/QxIJ3od4jtTJwhaD0IptaaPqxspUkgzewcWnzvtfVEQ8k7OovAlo3bOnzeNovtgNBSkpcRN+MZ17nOx+hnpG6khq0OSGUrvR3IoM5WPCoozk/5eCwaJ68w0On4Diq6EWuY72Ctjk7+Wrn7kHrykRvcAzp3bpVEWwIZ1pmWwfSLpuLL8yU8Ji6h9+Be9B9m89g/QGwP1D0HtU9ZU31dbbzHj65uLC4S2wOh5RBeCybWtte7h9cPIzafLuxBArpWwG7aEsii9i5YGnvCKGZdOo2Ff1+Cx+smHofi3kVc/ftv2R6bCS6BmnuxvpEN1D0Kga+B5Fu99a2KWzmg9v8g+DwNv2YSQIp/Ya06PCC2z0ow7n6NKwtFkB63Yar+ANH1gICUIIXX6AShNLBl85H2smPzke5uW7TlyUfVFTWUrf+CwtJCho4ebP/Emdh+TMU8kpv9PvDPtNb1t0jAeyzin4WpvpOk/gPpg5RaycXU3Fe/c5HPupbnKKTHj0H8jcfHq8GErFaIThBqs/ZsPqItgS6qtclHhSUFjD0hjRt+RlaR+k4xYg3/ESB5E1IAD0gRUvBdTPXdpOxANFUQK8OE19YvEY7SMEEoug5Tcz9S+P3G412FQGGn3o5qnfYJdGFdctGSqxe4epPqfp38byOl94C7F1YV4lTEup0IvkhykohA6HUwySMgKn00CeSIjC5a8k4k9RwAL+I/waoM5D0WKxG4wDMCKb7DKvAh9R2XvhOwmvnNGfCMAJNinQBY1zWZmfOQILYdgq9C6D/ZuX4W6e1ADslYKTR3MRR8F2ruo6FjEDcEzgTPcACkx831HxbT+MFvQgKzMKElENuKdetQv6y48PvWugLv2PrbjmZc/TNbMixhIxUX1spLj9WB6RmWuTiySJNAjkrHtOSmJHAKn35QxJZ1TxCsrmbP7pGceP5JHDqm6UGtlCkTr7XyL/wWJrwKXKX1KwitdQ5ScBmm4gOszsco1gfQixRe3XCKYE2IpQuWsf/LpfTsG2PA4Scw5qTZiMvGDsLwqiYbqTQylf+LlD7giM5ITQI5LJ3bra1ZvI6HbnuGSBCsjrltrFo8n2vvvoJhRx/atpOI19qezH9S8nPuQUjJXZjgcxD92KpZmHdWw/BhNBzl/hvv4JJr1+ILxHC7DYZP2Lr2JQZP+INtpc1NcBGpOzCDVtk07+G2XKcr0z6BHGdr52FsDwQXYYJLee7epxvXKNSLBMM8eVdrw4Pt5O6NFHwbKf6NNSLQZP7A6lfe56y56yksiZJXYPAFwB8w9O63jertj9kXQ4tToAVM8/Js3ZMmgW6kM52HpvYpTMXVmJoHMTXzufGutRx5bHLnXfnGL9t2wtgea61BB+ehlK1/j/6HBnE3G4TwB8AVW9Khc6Yi/hNprHzUlAHvEbZdpyvTJNDNdKhlEP0M6hZg3ReHEIL4A4Yrfr4NXyBxlKBHr4Ns+BHbjqm4wUooFddiKr4HkY3tfh+lfYtazB9uj40T3PzT6js7D6y9cAM+KPyBY3ZT0j6Bbqy1acnQ2H9ggktItSjIxGHMpBrWLLM++L6Aj9O/c0rLFzRRzP6fgqmgYQFQfCem8jak5G5wl7Q59mNOPZmK3Y/Td1CzW5IweIumt/k8ByVeq4Zh+B1M5F2QHlYVJAdNT9Yk0F3FqyGylgHiAc94cCWuMkwcWagf6mvG7XMTyHfhCXhxu1ycMW8mU+Yc2/I1w2vA1KU4VwwTWoLkn9Pm8HsP6sXnO68iWPsXXK44vgCEgi7cvgG48s9r83naRFzgn4z4J9t73hyhSaAbMsHXrDH+hm3HDFJ4I/jGNxyT0EqIjIfatRzaf1fCedxu2PRRT4jHiEajlK3/gmBtmEBBqnto6nc6SjXJKALxne1+H8MmnEw8OoHKbc8Ti1aQ33sC+Cbbt52aAmzqExCR00TkYxH5VERutuOcqoNi26BmPtY8/7r6P0FM1e3WHn9NNPQfBE4Gz9Fs3t6n/hkX8biHf9/Xmx1lIaLhKLFojHXLPuSBn/yr5Wt7WhpOC1jbiXWAy1NCyZBLyO93DfinagJIg07/i4qIG/gLMAsoB94RkWeNMR929tyq/Uzodaztv5oTiLwN/ukpnxrQ4wa2BZexec96cHlZvKCWNc9sSjgsGo6xcdWn7NtRQWm/FPf3nmHgHQ+RtTTufuSxioT4pnTujam0sSOtTgI+NcZsAhCRR4GvAZoEssHUkbpJHreW5LZEYEDeSZBnTewp3/g74oUBXFWJqwU9Xg8VO/anTgKAFP0YE3y5fhpuFHwnInlnO6anPRfZkQQGAVua/FwOOLOHpQsQ3yRM6JUUH3gD3gltPs/Ivkewa+te4kWJiSAaiTLgsFaqGIkbyZsNebPbGbnKFjv6BFJNrk7qahaReSKySkRW7dvbBZbEdleeMeCdROMEGAF8kHdOY+WeNpg59yRcX/oQEeJFAeJFAdy9i5g5dxqBwgwu8FFpZ0dLoBxoUi+KwUDStDJjzHxgPliVhWy4rkpFQAr/CyJrMeHlWMt/T2737LeSvsXc/PAPef7eV/j47U8pLC1g0reOZuzUUemJW2VNp8uLiYgH2AjMALYC7wAXG2NarA2t5cVy17ZoF9pqrb1iFZiaByDyH0DANwUp+I61RVs3k9HyYsaYqIhcAyzEmnP5YGsJQHVxxgBxkOaVgywZq2lgNxPBVN5Uvy17/ehJeAUm+om1q1EL79cJbBl0Nca8CNi4vExlXLwOU3t//c4/UfAcjhRcBZ6Wlw2ncymz7cLvQLyKxOHTGMQrrJoCDp0tCLqASNUzVf9bnwDqpxBHP8ZU/sT6kLSi6YIlqzhqF+30jW0hdXHUUP1zzqXTrxyiYud+QnVh+g7pnVyZJ/q59af5IiITxQQXIvkXtvk6qaokH5DdrdoHkbpKsr/+OefSJNDNVezcz/03PUz5xi8Rlwt/vo9L//sCRh/fZLQgttVaRJPURxyBaFm7r9m03+CArPcf+CaD/F99oZADk6ncVqeg77jsxNRF6O1Ad2bgru/Np+zDciLhKOFgmKq91cy/6WF2frG78Tj3IS1sEeazKgMDweogmz8sp2pvdYdCyWi15FTEixTfXj+Hwm398U5CevzG8esRnP3uu7lN6zazf1cVJp44jTgWibHsiZWcd/0c6wHPIeAdDZEDhT/BmnDgh8BMnvrji7y+4E3cXg/RcJRx08dw6W0X4PG179cn6yML7lKkx42N1Y4cUES0LbQl0I3t31WZsjJvPBZjz9a9CY9J0S0QOB2kAPCCdyJSfDvLn9zAssffIhKOEqwJEo1EeX/ZBzxxx3Odii2rG6qIaAJoQpNANzZ0zBBikeTdfLwBH6OmjEx8ULxIwbeQnv9Aei1AetwC7v4s/sfrhIOJBTcjoSgrn19FLNrGXYZbkPVbBAVoEujWSvuXMHnOsfgCjZuDuD0eevQsZMrsY9p0jpr9tSkfj8VNUjXijuiSW605jPYJ2ChYHaR84zZ69C6i7yG9sx0OAN+4+VyGjT2EpY+tIFgdYvyMscy6dBr+/BaqAzVz2LihbFjxUdLAQWmfYgIFgZSv6aicmnzUjWgSsMnLD7zKyw++hsfnIRqJMeSIQVx152UUFOdnNzCBKWdOZMqZbZpGnuScH57OZ2s+JxyKYOJxBMET8HDRzWenXj/aSc2HF8vKW96iXdmj0wuIOqK7LSBau2Q9D926IOHe2e1xM3z8MK6958osRmaPXVt2s/BvSyn7YAv9Du3DV781nUNHD87Y9XN60VKWZHQBkYLFDy9P6jyLRWNser+Mil2VlPRp+yq18o+/5Ok/v8zmD7dQ0rcHZ1wxkwkzjrI75HbpM6Q3l9xqc4Xfdsj60GI3p0nABtUVqSfQuD1u6qrqwBhe/edyPl/3BQOG92PGN0+i/9A+SceXb9zGHVfc05BQaitreei2x9i/p4rpFxyf1veQK1rbS0ETQ8fo6IANxk4dhduTvBTV5RJM3PDLC+/k9cdW8Pm6zbz17Cp+M/ePfLa2LOn45+5ZSKT5cFwwzPP3LOz0cFx30nzRko4sdI4mARuc+q2Tye+Rh8drNawE8Aa8XHjTOTzzl5cIVocaPsQmHicSDPPIr59MOs/mDeUptgCBaDRO5e6qNL6D3KdzDjpObwdsUNSzkJ8tuJ6lj7zBhys/oeeAEmZ88ySGHXUI//r1k5gUH+3tm3cRDkbwBRqr8PYaUErVnhQf9rghP9ujDG0UqgvzwZsfEw6GOXLK4RT3PsjehTbSvoOO0SRgk8KSAuZ871TmfO/UhMfzCvyE65JLfbvdLjzexFuIM66cyV9v+kfCJBxvwMuUMyfiz/M1P0WX88nqTdxz/d8BwZg4JhZn9ndnMevS6RmPpWnfgSaC1untQJpNv2gq3kBizX2vz8OkM47B5U785x9z/BFcdPM5FJYU4vV58Pq9nHD2ZM6//sxOxWDihk9Wb2LVy2vZtWX3wV/QAZFQhHuuf4hQbYhQbZBwXZhIOMoLf13M5g/L03LNg9FbhLbRlkCazZx7Ejs37+adl9fg9XuIhmMcftxwzv/RWSmPnzL7WCaffgzVFTXkFQbavVKvuX07KrjrqvlU7q0GYy0emjBrHJfeen7KxUUd9eFbG1OuyYmGorz13KqMzitoSicfHZwmgTRzuVxccut5nHn1qWzbtIM+g3vRa2Bpq68Rl1DUs9CW6z9w8z/Z/eW+hOXEa15dx/CjD+WEc+2rqxcJR1NtbIwxJmkORTalqnzk9KSgtwMZUty7iFGTRhw0Adhp/+4qtnz8ZVI9gUgwzOuPr7D1WqMmjSAWTV6x6Mvzc8yMownVhlj18lreePI/7G62jDnTdGgxkbYEurFIMIy4XUmlAwHCdfZ+OxeWFHDudXN48q4XiEZimHgcX8DH6CmH48/zcstpvwKBeDwOccPJ3ziRr11zmq0xdIQuWtIk0K31HtSLgqI8Kpo1xz1eDxNmHG379U46/yuMmDCMlS+sJlQTYtzJYxl57GHccur/Emo2QrJ0wZscOWUkh08cbnsc7eX0oUVNAjkoGo6yevH7fLJqEz0HlnD8WcdR0rc4+UCBy/7nQu75r78Ti8aIRWP4Aj6Kexfx1cumpyW2gSP6c+61jZuRfrjiY1KtUYsEw6x4dlWXSAJNObFloEkgxwRrgvzu23ezZ9s+wsEwHq+HRQ+9zvfvupwRxwwDIB6Ls+TRN1n+xFuEghHGnTyGguICqvZUcfjE4Uw645iESUrpFIum2ibd6kOMhjtflCQdnNYy0CSQYxY/vJxdW/cQDVudcNFIFCLw958/yi+fvwUEHvzZI6x/Y0PDpKN3F71Pj15F/Pyx69tcTMQuIycelnLdgy/gY+Kp4zMaS0c4YcGSjg7kmFUL1zYkgKZqKmvZuWU3OzbvYv3yDQmzDmPRGNX7a1n5wruZDBWAQL6fb/7sPLx+L676RVa+gI8jp4xk3LQxGY+nI1ItWOrSuy21k7YEcozXn/q/zMTjeP0ePn23LGkmIlj34J+8u4lp538l3SEmOe608QwbO4SVL75LXWUdR500mlHHjUhLZaJMOjDnINdbBJoEcsxJ532Ff//hhYQlxyJC/8P6UdqvhJ4DSlJO2vF4PPQbYtU9jIajLH74dVY+9y4Gw6TTj2HWpdPS2k/Qe3Av5syblbbzZ0t3mHyktwM5Zuo5kzj6xCPx+r34Aj4C+QGK+/TgitsvAWD4uKGU9ivG5U5cnOTyujnh65OtXYmu/isvP7iEXeW72V2+h0UPLeGuq+7DxDNfaq47yPXJR9oSyDEul4vLf30x2zft4PP1W6yZiFNG4nLV53OB6+77Ln/72SN8uqYMcUFp3xIu/cUFlPYr4eN3PqV84zYiocY+g0g4yrZNO9mwcmPiHoWq3XJxiFGTQI7qf1g/+h/WL+VzRT0L+eHdV1JbWUckHKW4V1HD/ffmD8oTEsABoboQZeu3aBKwQa4NMWoS6AKi4Shrl6xne9kuBgzry7jpYzq9ehAgv0de0mMlfYvx+b1JM/h8AR8l/VJMOFKdkgstA00CWVaxq5Lfffsv1FbWEaoL4c/z89SfXuTGv19Dj16pq/J8vu4LVr/yHgATTx3P0LFD2ny9o6eP5ok7nyVcl9h/6Pa4OWaW/VOJVddvGWgSyLIFtz9Nxa7KhpV+oboQkXCUx+94ju/8+uKk45/+00ssfWwF0fom/RtPv830C6dy9kEW47z17Cqeu2ch+3dXUtSzkOK+xVRX1CBYawwu//XFBDI8kciJumLLoFNJQER+C5wJhIHPgG8bYyrsCMwRDKx/46Okpb7xWIz3l36QdPiXn21n6YI3Ezv1gmGWPvoGU86YQP9h/fjs/TKq9lYz7KhDG+r7vfXsKhb89pmGYcWqvdV4A17OufYMxk8fm3rdgUqbrtYy6GxLYBFwizEmKiK3A7cAN3U+LOdoaYfsVI+vX/5Ryrn4sViclS+8y5pX11G1rxoRIRqOcvJFUzn7B2fw/H2vpChlHuHVh5cz7qQxbN+0g75D+zSOMKiM6Qotg04lAWPMK01+XAlkb5uaXCRw9LTRvLf0Q+Kxxvn1Lo+b8ack7zrk8XlwuYR4s6n4bpfwnxdXU7Wnmqbbyr3++FsMHXsIFTv3p7z83m37+MXXf4u43PjzvFx62wU6OpAF2S6BZmfqvxx4ycbzOcKFN55Nz/4l+PP9iMuFP99PrwGlnHdDcnHRY2YelbIuoDFQV1lH830lw8EwSx9bQWn/khavHwlHCQdDVO2rZv5N/0hbIVLVdplel3DQDUlFZDHQP8VTPzXGPFN/zE+BicC5poUTisg8YB7AwIGDjn112arOxN2txGNx1i3fwI6yXfQ/rC9jp45KOf8f4O2X1vCvXz7RMCMwHotx6uWnsOj/lhGqDSYdP/jwgcycO41//uqJhEVFqbg8bqZfeDxfv25O59+U6rTmG7Ee0JZWgq0bkhpjZrb2vIhcBswBZrSUAOrPMx+YD9auxG0JrtswUL2/Bq/fm3L/AJfbxbjpbVtRN+n0CYw5/gjWv/ERiLUFmj/fx6sPL0s61uvzMGHGURx32nhE4Jm7F7Jv+z4KSwoIVget4qBNxKMx9m3Tft2uovltAqSnI7GzowOnYXUETjPG1NoTUvfy6ZoyHv6fx9m73fpwjZl6BHNvPT/lRJ62KijOZ/LsYxIe++bPzuOh2xYQDVv1/bwBH6X9ipl+4fGsW7aBZ/78MhW79uP1eRk/fSwrnktuifkCPkZNHtnhuFpkoGJ3JV6fh4Ic2Umpq0pHR+JBbwdafbHIp4AfOBDRSmPMVQd73dijxpknnl7Y4evmit3le/jVN/6QUHLb7fFwyKiB/Ohv37f9el9+tp1lT6ykYnsFY6aOYvKcY/liw1b+/MP7k3Y16j2wJ3u+3NcQm8frobRfCT955DpbVxOWfbCFv//8UfbtqMDEYejYwVz+q4t1WNImB24ZmicCW28HWmOMGdGZ13d3SxesINqsqk4sGqX80+1s/WQ7g0am6mrpuIHD+3PRTWcnPPbiXxcl9QVEghF2l+/hvBvO4s2n3yZUF+aYmUcz4+ITbU0AlXuq+OP3/powRXnT+19w55X38ounbrR18xOnsqNloDMG02h72U7iKUprud0u9mzba3sSSGVnC739LrebwycOt3UDkuZWPPNOwtAnWMVPqitq+HjVZ4yapN8hdkg1+ag9dHZIGo2YMAxvioVAsUiUIYcPzEgMQ44YhKQo4WOMoTTNC4Z2btmd1PkI1t6I+7ZrB2Q6pOpMPBhNAml04tenEMgPIE1JlHpLAAAGYUlEQVRm4nkDXibMGtfq2L2dZs+bhadZE98X8DHrsml4/emtODxywmH4AsmjIQaTtb0JnaC9iUCTQBoVFOdz08M/4LjTxlNYUkCvAT0586pTmXtr5iZWDj58AP9133cZMX4YvoCPXgN78vXr53DGd1od+bXFxFPH0aNXEW5PY2vIG/AyatJIBo5I/62QaptOjQ50lFNGB5RVBfml+19lzavr8Pq8nHDuZE7+xlTcHvfBX6w67MgRA9o8OqBJQKluqD1JQG8HsqiuKsi2TTsIH2Q6r1LppEOEWRCNRHn0N0/zzktr8Hg9xOJxZs2dxuwrZ3a5WvwfvrWRlx98lT1fVjDsqCHMmTerxdqGKjdpEsiCp+560dpJKBK1thEDFv3jdUr69mDq2ZOyHF2jlS+s5tHfPNUw2Wjta/v5YMVGfvy3qxk4XDv2ugu9HciwWDTGm0+/nVTxNxIMs+ih17MUVbJ4PM6Tv38hYbahMYZIXYhn79b+nO5Ek0CGRYIR4rHUO/VW7avOcDQtq9xTnbDm4QADlL3/ReYDUmmjSSDDAgWBFqsIDx3T9qrB6ZZflGdVK0mhuG+PDEej0kmTQKYJXPDjr+FtMotPRPAFfJxz7RlZDCyRL+Bl0uxjk2YVegM+Trv8lCxFpdJBOwaz4Ohpo/nBn6/gpQdeY9eW3Rx65GDOuHIm/Yf1zXZoCS740VnEY3HeeXkNLpcLl8vFnO/NYsKM5PqHKnfpZCF1UMGaIFV7qyntX4LHq98buaA9k4X0f1QdVKAgQKAgkO0wVJpon4BSDqdJQCmH0ySglMNpElDK4TQJKOVwmgSUcjhNAko5nCYBpRxOk4BSDqdJQCmH0ySglMNpElDK4TQJKOVwmgSUcjhNAko5nCYBpRxOk4BSDqdJQCmHsyUJiMiPRMSISG87zqeUypxOJwERGQLMAnRHCqVykB0tgd8DN2JtTqOUyjGdSgIichaw1Rjznk3xKKUy7KAlx0VkMZBqC9qfAj8BvtqWC4nIPGAewMCBg9oRolIqnQ6aBIwxM1M9LiJHAcOA90QEYDDwrohMMsZsT3Ge+cB8sDYf6UzQSin7dHjzEWPMOqBh3ywRKQMmGmN22xCXUipDdJ6AUg5n2zZkxpihdp1LKZU52hJQyuE0CSjlcJoElHI4TQJKOZwmAaUcTpOAUg6nSUAph9MkoJTDaRJQyuE0CSjlcJoElHI4TQJKOZwmAaUcTpOAUg6nSUAph9MkoJTDaRJQyuHEmMzX/BSRXcDmNJy6N5ArNQ5zKVbIrXhzKVZIT7yHGmP6tOXArCSBdBGRVcaYidmOoy1yKVbIrXhzKVbIfrx6O6CUw2kSUMrhulsSmJ/tANohl2KF3Io3l2KFLMfbrfoElFLt191aAkqpduqWSUBEfiQiRkR6ZzuW1ojIb0XkIxF5X0SeEpGSbMfUnIicJiIfi8inInJztuNpjYgMEZElIrJBRD4QkWuzHdPBiIhbRNaIyPPZiqHbJQERGQLMAr7IdixtsAgYa4w5GtgI3JLleBKIiBv4C3A6MBr4hoiMzm5UrYoCNxhjjgSmAN/v4vECXAtsyGYA3S4JAL8HbgS6fGeHMeYVY0y0/seVWDs7dyWTgE+NMZuMMWHgUeBrWY6pRcaYbcaYd+v/XoX14RqU3ahaJiKDgdnA/dmMo1slARE5C9hqjHkv27F0wOXAS9kOoplBwJYmP5fThT9UTYnIUGAC8J/sRtKqP2B9YcWzGYRtG5JmiogsBvqneOqnwE+Ar2Y2ota1Fq8x5pn6Y36K1ZT9ZyZjawNJ8ViXb2GJSCHwb+A6Y0xltuNJRUTmADuNMatFZHo2Y8m5JGCMmZnqcRE5ChgGvCciYDWt3xWRScaY7RkMMUFL8R4gIpcBc4AZpuuN15YDQ5r8PBj4MkuxtImIeLESwD+NMU9mO55WTAXOEpEzgADQQ0QeNsZckulAuu08AREpAyYaY7rsQhIROQ24E5hmjNmV7XiaExEPVoflDGAr8A5wsTHmg6wG1gKxsv9DwF5jzHXZjqet6lsCPzLGzMnG9btVn0AO+jNQBCwSkbUicm+2A2qqvtPyGmAhVifbY101AdSbCswFTqn/91xb/02rWtFtWwJKqbbRloBSDqdJQCmH0ySglMNpElDK4TQJKOVwmgSUcjhNAko5nCYBpRzu/wOQtuw3lPosCgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_train, y_train = create_toy_data()\n",
    "x1_test, x2_test = np.meshgrid(np.linspace(-5, 5, 100), np.linspace(-5, 5, 100))\n",
    "x_test = np.array([x1_test, x2_test]).reshape(2, -1).T\n",
    "\n",
    "model = FishersLinearDiscriminant()\n",
    "model.fit(x_train, y_train)\n",
    "y = model.classify(x_test)\n",
    "\n",
    "plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train)\n",
    "plt.contourf(x1_test, x2_test, y.reshape(100, 100), alpha=0.2, levels=np.linspace(0, 1, 3))\n",
    "plt.xlim(-5, 5)\n",
    "plt.ylim(-5, 5)\n",
    "plt.gca().set_aspect('equal', adjustable='box')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.3 Probabilistic Discriminative Models"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.3.2 Logistic Regression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_train, y_train = create_toy_data()\n",
    "x1_test, x2_test = np.meshgrid(np.linspace(-5, 5, 100), np.linspace(-5, 5, 100))\n",
    "x_test = np.array([x1_test, x2_test]).reshape(2, -1).T\n",
    "\n",
    "feature = PolynomialFeature(degree=1)\n",
    "X_train = feature.transform(x_train)\n",
    "X_test = feature.transform(x_test)\n",
    "\n",
    "model = LogisticRegression()\n",
    "model.fit(X_train, y_train)\n",
    "y = model.proba(X_test)\n",
    "\n",
    "plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train)\n",
    "plt.contourf(x1_test, x2_test, y.reshape(100, 100), np.linspace(0, 1, 5), alpha=0.2)\n",
    "plt.colorbar()\n",
    "plt.xlim(-5, 5)\n",
    "plt.ylim(-5, 5)\n",
    "plt.gca().set_aspect('equal', adjustable='box')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.3.4 Multiclass logistic regression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_train, y_train = create_toy_data(add_class=True)\n",
    "x1, x2 = np.meshgrid(np.linspace(-5, 10, 100), np.linspace(-5, 10, 100))\n",
    "x = np.array([x1, x2]).reshape(2, -1).T\n",
    "\n",
    "feature = PolynomialFeature(1)\n",
    "X_train = feature.transform(x_train)\n",
    "X = feature.transform(x)\n",
    "\n",
    "model = SoftmaxRegression()\n",
    "model.fit(X_train, y_train, max_iter=1000, learning_rate=0.01)\n",
    "y = model.classify(X)\n",
    "\n",
    "plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train)\n",
    "plt.contourf(x1, x2, y.reshape(100, 100), alpha=0.2, levels=np.array([0., 0.5, 1.5, 2.]))\n",
    "plt.xlim(-5, 10)\n",
    "plt.ylim(-5, 10)\n",
    "plt.gca().set_aspect('equal', adjustable='box')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.5 Bayesian Logistic Regression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_train, y_train = create_toy_data()\n",
    "x1_test, x2_test = np.meshgrid(np.linspace(-5, 5, 100), np.linspace(-5, 5, 100))\n",
    "x_test = np.array([x1_test, x2_test]).reshape(2, -1).T\n",
    "\n",
    "feature = PolynomialFeature(degree=1)\n",
    "X_train = feature.transform(x_train)\n",
    "X_test = feature.transform(x_test)\n",
    "\n",
    "model = BayesianLogisticRegression(alpha=1.)\n",
    "model.fit(X_train, y_train, max_iter=1000)\n",
    "y = model.proba(X_test)\n",
    "\n",
    "plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train)\n",
    "plt.contourf(x1_test, x2_test, y.reshape(100, 100), np.linspace(0, 1, 5), alpha=0.2)\n",
    "plt.colorbar()\n",
    "plt.xlim(-5, 5)\n",
    "plt.ylim(-5, 5)\n",
    "plt.gca().set_aspect('equal', adjustable='box')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
